// Copyright 2007-2009 Comdiv (F. Sadykov) - http://code.google.com/u/fagim.sadykov/
// 
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//     http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// MODIFICATIONS HAVE BEEN MADE TO THIS FILE


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Boo.Lang.Compiler;
using Boo.Lang.Compiler.Ast;

namespace MvcContrib.Comdiv.Framework{
    public class RouteMacro : LexicalInfoPreservingMacro
    {
        protected override Statement ExpandImpl(MacroStatement macro)
        {
            if (macro.Arguments.Count == 0)
            {
                throw new Exception("init must be called with argument");
            }
            var url = (StringLiteralExpression)macro.Arguments[0];
            var defaults = (HashLiteralExpression)macro.Arguments[1];
            var call = new MethodInvocationExpression(AstUtil.CreateReferenceExpression("RouteRegister"), url, defaults);
            var name = "route:" + url.Value;
            var registryref = new SlicingExpression(new ReferenceExpression("registry"),new StringLiteralExpression(name));
            var result = new Block();
            result.Add(new ExpressionStatement(
                           new BinaryExpression(BinaryOperatorType.Assign,
                                                registryref,call
                               )
                           ));
            return result;
        }
    }
}